/*Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Sara López 12050
 * Matías Vasquez 12186
 * Sección: 21
 * Java Class: BinaryTree
 */

/**
 *
 * @author saralopez
 */


public class BinaryTree <E> {

    protected E valor;
    protected BinaryTree<E> padre;
    protected BinaryTree<E> left,right;
    
    
    //Constructor vacío
    
    public BinaryTree(){
        valor=null;
        padre=null;
        left=right=null;
    }
    
    
    //Constructores
    
    public BinaryTree(E value){
        valor=value;
        right= new BinaryTree<E>();
        left=new BinaryTree<E>();
        setLeft(left);
        setRight(right);
    }
    
    public BinaryTree(E value,BinaryTree <E> left, BinaryTree <E> right){
        valor=value;
        if(left==null){
            left=new BinaryTree<E>();
            setLeft(left);
        }
        if(right==null){
            right=new BinaryTree<E>();
            setRight(right);
        }
    
    }
    

   /*---------------------------------------------------------------*/ 
    //pre:
    //post: devuelve el subárbol derecho
    
    public BinaryTree<E> right(){
        return right;
    }
    
    //pre:
    //post: devuelve el subárbol derecho
    
    public BinaryTree<E> left(){
        return left;
    }
    
    //pre:
    //post: devuelve padre
    
    public BinaryTree<E> padre(){
        return padre;
    }
    
    //pre:
    //post: Devuelve el valor
    
    public E value(){
        return valor;
    }
    
    //pre:
    //post: Asigna un valor al nodo.
    
    public void setValue(E value){
        valor=value;
    }
    
    /*----------------------------------------------------------------*/
    
    //pre: que el padre de right no sea null
    //post: Le asigna un nuevo valor al nodo derecho
    
    
    public void setRight(BinaryTree<E> newRight){
        if(isEmpty()) return;
        if (right != null && right.padre() == this) right.setPadre(null);
        right = newRight;
        right.setPadre(this);
        
    }
    
    //pre: que el padre de left no sea null
    //post: Le asigna un nuevo valor al nodo izquierdo
    
    
     public void setLeft(BinaryTree<E> newLeft){
        if (isEmpty()) return;
        if (left != null && left.padre() == this) left.setPadre(null);
        left = newLeft;
        left.setPadre(this);
    }
     
     //pre:
     //post: newParent se transforma en padre
     
     public void setPadre(BinaryTree<E> newPadre){
         if(!isEmpty()){
             padre=newPadre;
         }
     }
     
     //pre:
     //post: Devuelve si el árbol está vacío
     
     
     public boolean isEmpty(){
        return valor==null&&padre==null&&left==this&&right==this;
     }
     
     
}
